/**
 * 用户数据表
 */
#pragma once

#include "EventHash.h"
#include "EventList.h"
#include "EventString.h"
#include "UserItem.h"

/* 用户数据表对象 */
typedef struct _UserTable UserTable;
#define USER_TABLE(any) ((UserTable *)any)

extern UserTable *user_table_new(void);

/**
 * 根据用户电话查询 UserID
 */
extern euint32 user_table_get_uid_from_phone(UserTable *self, euint64 phone);

/**
 * 根据用户 UserID 查询电话号码
 */
extern euint64 user_table_get_phone_from_uid(UserTable *self, euint32 uid);

/**
 * 根据用户电话获取 UserItem
 */
extern UserItem *user_table_get_uitem_from_phone(UserTable *self,
						 euint64    phone);

/**
 * 根据用户 UserID 获取 UserItem
 */
extern UserItem *user_table_get_uitem_from_uid(UserTable *self, euint32 uid);

/**
 * 添加初始用户，也可以用来重置用户账户
 * 将对 EventString 添加一次引用计数
 * @return 返回新增用户的 UserID
 */
extern euint32 user_table_add_initialize_user(UserTable *self, euint64 phone,
					      EventString *user_name,
					      EventString *password);

/**
 * @brief 验证用户是否存在
 * @return true / false
 */
extern bool user_table_verify_user_exist(UserTable *self, euint32 user_id);

/**
 * @brief 向指定用户添加一条事件组信息，不会验证用户是否存在。
 */
extern void user_table_add_group_item(UserTable *self, euint32 user_id,
				      euint32 group_id);

//
extern void __user_table_add_item(UserTable *table, euint64 phone,
				  EventString *password, EventString *user_name,
				  euint32 user_id, EventList *list);

extern UserItem *__user_table_from_id_get_item(UserTable *table,
					       euint32	  user_id);

extern EventHash *__user_table_get_hash_table(UserTable *table, int index);
